/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo5;

import au.com.bytecode.opencsv.CSVReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Clase que carga los trayectos de la agencia desde un fichero csv.
 * @author Diego
 */
public class CargaTrayectos {
    /**
     * Devuelve la lista de trayectos disponibles en la agencia.
     * @param ficheroTrayectos fichero.csv con los trayectos a cargar
     * @param ficheroTrenes fichero.csv con los trenes a cargar
     * @return la lista de trayectos disponibles en la agencia
     * @throws IllegalArgumentException
     * @throws RuntimeException
     */
    public List<Trayecto> obtenerTrayectos(String ficheroTrayectos, String ficheroTrenes) throws IllegalArgumentException, RuntimeException
    {
        // Comprobamos los argumentos
        Args.comprobarCadena(ficheroTrayectos);
        Args.comprobarCadena(ficheroTrenes);

        // Obtenemos los trenes disponibles
        CargaTrenes ct = new CargaTrenes();
        List<Tren> ltrenes = ct.obtenerTrenes(ficheroTrenes);
        List<Trayecto> ltrayectos = new ArrayList<Trayecto>();

        try
        {
           CSVReader reader = new CSVReader(new FileReader(ficheroTrayectos));
           String [] nextLine;

           // Mientras haya líneas en el fichero...
            while((nextLine = reader.readNext()) != null)
            {
                // Extraemos la informacion
                String nombreTren = nextLine[0].trim();
                String ciudadOrigen = nextLine[1].trim();
                String ciudadDestino = nextLine[2].trim();
                String numTramos = nextLine[3].trim();
                Iterator<Tren> itrenes = ltrenes.iterator();
                Boolean encontrado = false;
                Tren tren = null;

                // Buscamos si el tren especificado en el fichero existe
                while(itrenes.hasNext() && !encontrado)
                {
                    tren = itrenes.next();

                    if(tren.getTipo().equals(nombreTren))
                    {
                        encontrado = true;
                    }
                }

                // Si existe, extraemos los horarios del fichero
                if(encontrado)
                {
                    int cont = 4;
                    List<HorarioTren> lhorarios = new ArrayList<HorarioTren>();

                    // mientras haya dos campos más sigue leyendo el fichero
                    while((cont+1) < nextLine.length)
                    {
                        String horaSalida = nextLine[cont].trim();
                        String horaLlegada = nextLine[cont+1].trim();

                        HorarioTren h = new HorarioTren(horaSalida,horaLlegada, tren);
                        lhorarios.add(h);

                        cont += 2;
                    }

                    // Finalmente se añade un nuevo trayecto
                    ltrayectos.add(new Trayecto(Integer.parseInt(numTramos),lhorarios,ciudadOrigen,ciudadDestino));
                }
                else
                {
                     throw new RuntimeException("CargaTrayectos(obtenerTrayectos): Tren no encontrado.");
                }
            }
        }
        catch(FileNotFoundException f)
        {
            throw new RuntimeException("CargaTrayectos(obtenerTrayectos): El fichero no existe. Mensaje: " + f.getMessage());
        }
        catch(IOException io)
        {
            throw new RuntimeException("CargaTrayectos(obtenerTrayectos): Problema al leer el fichero. Mensaje: " + io.getMessage());
        }

        return ltrayectos;
    }
}
